package ru.chezclif.lern.conread;
import java.util.List;
import ru.chezclif.lern.conread.enumerations.EnumPseudoProtocols;
import ru.chezclif.lern.conread.readers.PropertyReader;
import ru.chezclif.lern.conread.readers.ReadOnlyPropertyReader;
/**
 * Основной класс для чтения, сохранения и редактирования настроек.
 * Являеться классом-оберткой к незащищенному DataBuffer.
 * @author Vit
 */
public class ReadProperties implements PropertyReader, ReadOnlyPropertyReader {
	/** Экземпляр хранилища данных*/
	private final DataBuffer propertiesData = new DataBuffer();
	@Override
	/**Чтение файла и сохранение настроек в хранилище даннных
	 * @param pseudoProtocolString строка, содержащая псевдопротокол и путь до оперируемого файла */
	public void readFile(String pseudoProtocolString) {
		Preconditions.notBlank(pseudoProtocolString);
		Preconditions.notNull(pseudoProtocolString);
		PseudoProtocolParser stringParser = new PseudoProtocolParser();
		stringParser.pseudoProtocolParsing(pseudoProtocolString);
		if (stringParser.getProtocolType() == EnumPseudoProtocols.INI) {
			IniParser parserIni = new IniParser();
			parserIni.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType() == EnumPseudoProtocols.PROPERTIES) {
			PropertyParser parserProperties = new PropertyParser();
			parserProperties.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType() == EnumPseudoProtocols.XML) {
			XmlParser parserProperties = new XmlParser();
			parserProperties.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType() == EnumPseudoProtocols.FILE) {
			FileParser parserProperties=new FileParser();
			parserProperties.parseFile(stringParser.getPath(), propertiesData);
		}
	}
	/**Сохранение в файл определенного формата настроек из хранилища данных 
	 * @param pseudoProtocolString строка, содержащая псевдопротокол и путь до оперируемого файла*/
	@Override
	public void saveFile(String psevdoProtokolString) {
		Preconditions.notBlank(psevdoProtokolString);
		Preconditions.notNull(psevdoProtokolString);
		PseudoProtocolParser stringParser = new PseudoProtocolParser();
		stringParser.pseudoProtocolParsing(psevdoProtokolString);
		if (stringParser.getProtocolType() == EnumPseudoProtocols.INI) {
			IniSaver saveIni = new IniSaver();
			saveIni.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType() == EnumPseudoProtocols.PROPERTIES) {
			PropertySaver saveProperties = new PropertySaver();
			saveProperties.parseFile(stringParser.getPath(), propertiesData);
		}
		if (stringParser.getProtocolType() == EnumPseudoProtocols.XML) {
			XmlSaver saveProperty = new XmlSaver();
			saveProperty.parseFile(stringParser.getPath(), propertiesData);
		}
	}
	/** Получить значение настройки по ключу
	 * @param key ключ */
	@Override
	public String getSetting(String key) {
		Preconditions.notBlank(key);
		Preconditions.notNull(key);
		return propertiesData.getSetting(key);
	}
	/** Задать ключу значение
	 * @param key ключ
	 * @param value значение*/
	@Override
	public void setSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		propertiesData.setSetting(key, value);
	}
	/** Удалить одну настройку (ключ со значением)
	 * @param key ключ
	 * @param value значение*/
	@Override
	public void removeSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		propertiesData.removeSetting(key, value);
	}
	/**Получить заглавный комментарий */
	@Override
	public String getHeaderComment() {
		return propertiesData.getHeaderComment();
	}
	/** Задать заглавный комментарий
	 * @param headerComment Заглавный комментарий*/
	@Override
	public void setHeaderComment(String comment) {
		Preconditions.notNull(comment);
		propertiesData.setHeaderComment(comment);
	}
	/**Получить конечный комментарий */
	@Override
	public String getFooterComment() {
		return propertiesData.getFooterComment();
	}
	/**Задать конечный комментарий
	 * @param footerComment Конечный комментарий*/
	@Override
	public void setFooterComment(String comment) {
		Preconditions.notNull(comment);
		propertiesData.setFooterComment(comment);
	}
	/**Получить коллекцию всех ключей из хранилища настроек
	 * @param localBufferForKeys коллекция для заполнения ее ключами*/
	@Override
	public List<String> getKeys(List<String> localBufferForKeys) {
		Preconditions.notNull(localBufferForKeys);
		localBufferForKeys = propertiesData.getKeys(localBufferForKeys);
		return localBufferForKeys;
	}
	/**Получить коллекцию ключей находящихся в определенной субсекции
	 * @param localBufferForKeys коллекция для заполнения ее ключами*/
	@Override
	public List<String> getSubsectionKeys(String sectionName, List<String> localBufferForSubsectionKeys) {
		Preconditions.notNull(localBufferForSubsectionKeys);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
			localBufferForSubsectionKeys = propertiesData.getSubsectionKeys(sectionName, localBufferForSubsectionKeys);
				return localBufferForSubsectionKeys;
	}
	/** Получить коллекцию значений находящихся в определенной субсекции
	 * @param sectionName название секции до точки
	 * @param localBufferForSubsectionvalues коллекция для заполнения ее ключами из субсекции */
	@Override
	public List<String> getSubsectionValues(String sectionName, List<String> localBufferForSubsectionvalues) {
		Preconditions.notNull(localBufferForSubsectionvalues);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
			localBufferForSubsectionvalues = propertiesData.getSubsectionValues(sectionName, localBufferForSubsectionvalues);
				return localBufferForSubsectionvalues;
	}
}
